LinuC-1 - 102試験 - 1.08:システム管理 - 1.08.2 ジョブスケジューリング

Last Update : January 02 2021 16:07:27

     

a. ジョブスケジューリング

ジョブスケジューリングは、あらかじめ決められた時間に所定の順序でデータを効率的に処理し、オンライン ユーザーへの影響を最小限にとどめながらシステム リソースを最大限有効に利用できるようにすることを狙いとしています。バッチ プロセスは、システムがバックグラウンドでデータベースと対話するプロセスです。ユーザーの介入を必要とせずにシーケンシャルに実行されます。バッチ プロセスは自動的に開始することも、手動で開始することもできます。一般に、バッチは、ユーザーがシステムを使用する頻度の低い営業時間外に実行されます。
バッチ処理は、リソース消費が高く、実行時間の長い繰り返しプロセスになりがちなので、ほとんどの場合は、バッチ処理専用のアーキテクチャが必要になります。バッチには、データベースから大量のデータを読み取って処理した後、結果をデータベースに返すという一連のプロセスが含まれるのが普通です。このプロセスは、複数のスクリプトの実行を通じて実現されます。
Linux で利用可能なスケジューリング機能として、cron 機能と anacron 機能、そして crontab コマンドと at コマンドがあります。


b. cron

定期的にジョブを実行するための管理は cron 機能によって行われます。cron 機能は、crond デーモンと、どんな作業をどんな頻度で実行すべきかを記述した一連のテーブルで構成されます。このデーモンは毎分ウェイクアップして crontab をチェックし、何をすべきかを判断します。ユーザーは crontabコマンドを使って crontab を管理します。crondデーモンは通常、システム起動時に init プロセスによって起動されます。

時刻、日、月、曜日、週の組み合わせに従って定期的なタスクの実行をスケジュールするのに使用できるデーモンです。 cron は、システムが継続的に稼働状態であることを前提としています。ジョブがスケジュールされている時にシステムが稼働していない場合は、ジョブは実行されません。cron は、最高で 1 分おきの頻度でジョブを実行することができます。

1. cronの設定

cron ジョブを設定するための設定ファイル /etc/crontab (root のみが修正可能) には、以下のような行が記載されています:

# vi /etc/crontab
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user command to be executed

最初の 3 行には、anacrontab ファイルと同じく、SHELL、PATH、及び MAILTO の変数が記載されています。これらの変数に関する詳細は、「Anacron ジョブの設定」 を参照して下さい。第 4 行には、HOME 変数が記載されています。HOME 変数は、コマンド又はスクリプトの実行時に使用するホームディレクトリの設定に使用します。
/etc/crontab ファイルの残りの行はスケジュールされているジョブを示しており、以下の形式を取ります:

minute hour day month day of week user command

minute ・・・ 0 から 59 までの任意の整数
hour ・・・ 0 から 23 までの任意の整数
day ・・・ 1 から 31 までの任意の整数 (月が指定されている場合は、その月の有効な日)
month ・・・ 1 から 12 までの任意の整数 (或いは jan や feb などの省略形の月名)
day of week ・・・ 0 から 7 までの任意の整数。ここで 0 及び 7 は日曜日を指す (或いは sun や mon などの省略形の曜日名)
user ・・・ ジョブが実行されるアカウントのユーザー名を指定します。
command ・・・ 実行するコマンド (ls /proc >> /tmp/proc などのコマンド、もしくはカスタムスクリプトを実行するコマンドを指定可能)。

上記のいずれかの値にアスタリスク (*) を使用すると、全ての有効な値を指定することができます。例えば、月の値にアスタリスクを使用すると、コマンドはその他の値による制約の範囲内で毎月実行されます。
整数の間のハイフン (-) は、整数の範囲を指定します。例えば、1-4 は整数 1、2、3、4 を意味します。
カンマ (,) で区切られた値は、一覧を指定します。例えば、3, 4, 6, 8 はそれらの 4 つの特定の整数を示します。
スラッシュ (/) を使用すると、ステップ値を指定することができます。範囲の後に / を付けると、その範囲内で、指定した整数の値をスキップすることができます。例えば、0-59/2 とすると、分フィールドで 1 分おきの間隔を定義することができます。ステップ値は、アスタリスクと併用することも可能です。例えば、月フィールドで値 */3 を指定すると、3 ヶ月ごとにタスクが実行されます。
先頭にハッシュ記号 (#) が付いた行はコメント行で、処理の対象外です。

root 以外のユーザーは、crontab ユーティリティを使用して cron タスクを設定できます。ユーザー定義の crontab は全て /var/spool/cron/ ディレクトリに格納されており、 crontab を作成したユーザーのユーザー名で実行することができます。ユーザーとして crontab を作成するには、そのユーザー名でログインしてコマンド crontab -e を入力してから、VISUAL 又はEDITOR 環境変数で指定されているエディターを使用してユーザー用の crontab を編集します。このファイルは /etc/crontab と同じ形式を使用します。crontab への変更を保存すると、crontab はユーザー名に応じて保存され、ファイル /var/spool/cron/username に書き込まれます。

$ crontab -e

自分個人の crontab ファイルのコンテンツを一覧表示するには crontab -l コマンドを使用します。 ユーザーは指定しないでください。<めせ>

$ crontab -l

crontab ユーティリティを使用している場合、ジョブの定義でユーザーを指定する必要はありません。
/etc/cron.d/ ディレクトリには、/etc/crontab ファイルと同じ構文のファイルが格納されています。このディレクトリ内でファイルの作成と変更ができるのは root のみです。crontab のファイルが変更されても、デーモンを再起動する必要はありません。

● crontab コマンド構文
  crontab [オプション]

● crontab コマンドオプション
 -e 環境変数 VISUAL もしくは EDITOR で指定されているエディターを使って、現在の crontab を編集するのに使われる。編集終了後、 変 更された crontab は自動的にインストールされる。
 -u ユーザー どのユーザがcrontabを設定するのかを指定します。省略した場合はcrontabコマンドを実行したユーザで設定されます。
 -l 現在の crontab の内容を標準出力へ表示させる。
 -r 現在の crontab ファイルを削除する。(全ての設定が削除される)

2. cron サービスの起動と停止
サービスが実行中かどうかを判断するには、コマンド /sbin/service crond status を使用します。cron サービスを起動するには、コマンド /sbin/service crond start を使用します。サービスを停止するには、コマンド /sbin/service crond stop を使用します。サービスはブート時に起動することを推奨します。


c. at

at コマンドは特定の時刻での 1 回限りのタスクのスケジュールに、batch コマンドはシステム負荷平均が 0.8 を下回った時に実行される 1 回限りのタスクのスケジュールに使用します。
at 又は batch を使用するには、at RPM パッケージをインストール済みで、atd サービスが稼働している必要があります。パッケージがインストール済みかどうかを判断するには、rpm -q at コマンドを使用します。サービスが稼働中であるかを判断するには、/sbin/service atd status コマンドを使用します。

1. at ジョブの設定
特定の時刻に 1 回限りのジョブをスケジュールするには、コマンド at time を入力します。ここで、time は、コマンドを実行する時刻です。

● at コマンド構文
  at [オプション] [time]

● at コマンドオプション
 -f file ファイルで実行するジョブを指定する
 -l 実行待ちのジョブを表示する(atqと同じ)
 -d ジョブ 予約中のジョブをジョブ番号で指定して削除する
 -m ジョブ終了をユーザにメールで通知します。

● time オプション
 HH:MM 例えば、04:00 は午前 4:00 時を指定します。その時刻が既に過ぎている場合には、翌日の同じ指定時刻に実行されます。
 midnight 午前 0:00 時を指定します。
 noon 午後 0:00 時を指定します。
 teatime 午後 4:00 時を指定します。
 month-name day year 例えば、January 15 2002 は 2002 年 1 月 15 日を指定します。年はオプションです。
 MMDDYY
 MM/DD/YY
 MM.DD.YY
例えば、011502 は 2002 年 1 月 15 日となります。
 now + time time は、分、時、日、週のいずれかで指定します。例えば、now + 5 days は、現在から 5 日後の同じ時刻にコマンドが実行されるように指定します。

オプションの date の前に time を指定する必要があります。(time 形式に関する詳細は、/usr/share/doc/at-xx.xx.xx/timespec のテキストファイル)
at コマンドに time 引数を付けて入力すると、at> プロンプトが表示されます。実行するコマンドを入力して、Enter を押した後に、Ctrl+D を押します。複数のコマンドを指定するには、各コマンドを入力した後に Enter キーを押してください。全てのコマンドを入力したら Enter を押して空白行に移動し、そこで Ctrl+D を押します。もう一つの方法としては、プロンプトでシェルスクリプトを入力して、スクリプトの各行の後で Enter を押してから、空白行で Ctrl+D を押して終了する方法があります。スクリプトが入力された場合、使用されるシェルはユーザーの SHELL 環境で設定されているシェル、ユーザーのログインシェル、/bin/sh の中のいずれかとなります (最初に検出されたシェル) 。
標準出力に情報を表示するようなコマンドやスクリプトを入力した場合、その出力はユーザーに電子メールで送信されます。
コマンド atq を使用すると、保留中のジョブを表示できます。

2. 保留中のジョブの表示
保留中の at ジョブと batch ジョブを表示するには、atq コマンドを使用します。atq コマンドを実行すると、1 行につき 1 ジョブが記述された保留中ジョブの一覧が表示されます。各行は、ジョブ番号、日付、時間、ジョブクラス、ユーザー名の形式で記述されます。一般ユーザーが表示できるのは、自分のジョブのみです。root ユーザーがatq コマンドを実行した場合は、全ユーザーの全てのジョブが表示されます。

3. サービスの起動と停止
at サービスを起動するには /sbin/service atd start のコマンド、停止するには /sbin/service atd stop のコマンドを使用します。このサービスは、ブート時に起動することを推奨します。


d. cronとatのアクセス制御

1. cron へのアクセスの制御

/etc/cron.allow ファイルと /etc/cron.deny ファイルは、cron へのアクセスを制御するために使用されます。この両方のアクセス制御ファイルは、1 行につき 1 ユーザー名の形式を取り、空白は許可されていません。アクセス制御ファイルが変更された場合でも、cron デーモン (crond) を再起動する必要はありません。アクセス制御ファイルは、ユーザーが cron ジョブの追加又は削除を試みる度にチェックされます。
アクセス制御ファイルに記載されているユーザー名に関わらず、root ユーザーは常時 cron を使用できます。
cron.allow ファイルが存在する場合は、そのファイルに記載されているユーザーのみが cron の使用を許可され、cron.deny ファイルは無視されます。
cron.allow が存在しない場合は、cron.deny に表示されているユーザーは cron を使用できません。
アクセスは、PAM (Pluggable Authentication Modules) を介して制御することもできます。これらの設定値は /etc/security/access.conf に格納されています。例えば、このファイルに以下の行を追記すると、root ユーザー以外のユーザーはすべて crontab の作成を禁止されます:
-:ALL EXCEPT root :cron 禁止されているジョブは、適切なログファイルにログ記録されます。又、“crontab -e” を使用している時は、標準出力に返されます。詳細は、access.conf.5 を参照して下さい (man 5 access.conf のコマンドで表示します)。


2. cron ジョブのブラックリスト/ホワイトリスト

ジョブのブラックリストとホワイトリストは、定義済みジョブで実行が不要な部分を省略するのに使用します。/etc/cron.daily などの cron フォルダ上の run-parts スクリプトを呼び出す際に、このフォルダ内のどのプログラムが run-parts によって実行されないようにするかを定義することができます。
ブラックリストを定義するには、フォルダ内で run-parts の実行元となる jobs.deny ファイルを作成します。例えば、/etc/cron.daily から特定のプログラムを省略する必要がある場合には、ファイル /etc/cron.daily/jobs.deny を作成する必要があります。このファイル内で、同じディレクトリから省略されるプログラムの名前を指定します。run-parts /etc/cron.daily などのコマンドが特定のジョブによって実行される時には、これらのプログラムは実行されません。
ホワイトリストを定義するには、jobs.allow ファイルを作成します。
jobs.deny と jobs.allow の原則は、「Cron へのアクセスの制御」 セクションに説明した cron.deny と cron.allow の原則と同じです。


3. at と batch へのアクセスの制御

at コマンドと batch コマンドへのアクセスを制限するには、/etc/at.allow 及び /etc/at.deny のファイルを使用することができます。いずれのアクセス制御ファイルも、1 行につき 1 ユーザー名の形式を取り、空白は許可されていません。アクセス制御ファイルが変更された場合でも、at デーモン (atd) を再起動する必要はありません。アクセス制御ファイルは、ユーザーが at 又は batch のコマンドの実行を試みる度に読み込まれます。
アクセス制御ファイルに関わらず、 root ユーザーは常時 at 及び batch のコマンドを実行することができます。
at.allow が存在する場合は、その中に記載されているユーザーのみが at 又は batch の使用を許可され、at.deny ファイルは無視されます。
at.allow が存在しない場合は、at.deny に記載されているユーザーは at 又は batch を使用できません。


z. 出題範囲概要

概要 :
  • cronまたはanacronを使用して定期的にジョブを実行したり、atを使用して指定時刻にジョブを実行できる。

詳細 :
  • cronおよびatでジョブを管理する。
    /var/spool/cron/
  • ユーザがcronおよびatサービスにアクセスできるよう設定する。
    /etc/cron.allow, /etc/cron.deny
    /etc/at.deny, /etc/at.allow
    at, atq, atrm
    /etc/cron.{d,daily,hourly,monthly,weekly}/
    /etc/crontab
  • anacronの設定
    /etc/anacrontab

  [ 例題 ] 


         

    www.it-shikaku.jp